package org.demo.base.util;

import org.demo.base.auth.domain.SysUser;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * 登录相关的工具类
 * @author tomdog
 */
public class LoginHelper {

    private final static String LOGIN_USER = "LOGIN_USER";
    private final static Integer SESSION_TIME_OUT = 2*60*60;// 会话过期时间2小时，单位是秒

    /**
     * 登录成功后保存会话信息
     * 保存session（Servlet里面）
     */
    public static void saveSession(SysUser loginUser) {
        // 获取当前请求，请求里面有session，也有application
        HttpServletRequest request = currentRequest();
        // 会话中保存登录的用户
        loginUser.setPassword(null);// 会话中不保存密码
        request.getSession().setAttribute(LOGIN_USER, loginUser);
        // 刷新会话过期时间
        request.getSession().setMaxInactiveInterval(SESSION_TIME_OUT);
    }

    /**
     * 获取当前登录用户
     */
    public static SysUser currentLoginUser() {
        // 获取会话
        HttpServletRequest request = currentRequest();
        // 尝试获取当前登录用户
        Object obj = request.getSession().getAttribute(LOGIN_USER);
        return obj==null? null: (SysUser) obj;
    }

    /**
     * 刷新登录时间，每次调接口都会刷新（拦截器里面处理）
     */
    public static void freshSessionTime() {
        // 获取会话
        HttpServletRequest request = currentRequest();
        // 刷新会话过期时间
        request.getSession().setMaxInactiveInterval(SESSION_TIME_OUT);
    }

    /**
     * 移除当前会话
     */
    public static void invalidSession() {
        // 获取会话
        HttpServletRequest request = currentRequest();
        // 使会话立即过期
        request.getSession().invalidate();
    }

    /**
     * 获取当前request
     * @return
     */
    private static HttpServletRequest currentRequest() {
        // 使用Spring的类动态获取request
        ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        assert reqAttr != null;
        return reqAttr.getRequest();
    }
}
